软件逆向分析包括哪些阶段
软件逆向分析包括以下阶段:
文件装载阶段:本阶段的主要工作是,读入目标文件并进行与目标文件相关的一些初步分析,包括文件格式解析(如Windows系列的PE格式和Linux操作系统上的ELF格式)、文件信息搜集和文件性质判定等。通过文件装载阶段的操作,可以分析出文件执行的入口地址,初步分析文件的数据段和代码段信息,以及文件运行所依赖的其他文件信息等。
指令解码阶段:本阶段的主要工作是,根据目标体系结构的指令编码规则,对目标文件中使用的指令进行解释、识别和翻译。可以将指令解码阶段的工作看作是一个反汇编器。根据逆向分析的目的和手段,可以将目标指令映射为汇编指令,也可以映射为某种中间表示形式。
语义映射阶段:本阶段的主要工作是,将二进制指令的执行效果通过语义描述的方法表示出来,并加以记录。由于指令的执行语义往往保存在与体系结构相关的文献资料中,因此该映射过程需要技术人员手工实现。但即便如此,仍需要用某种方法来描述指令的语义。
相关图构造阶段:本阶段的主要工作是,借助于编译理论中的许多知识完成相关图构造,如控制流图(Control Flow Graph,CFG)、调用图(Call Graph,CG)和依赖图(Dependence Graph,DG)等。在此基础之上便可以完成诸如控制流分析、数据流分析和依赖分析等操作,从而进一步对程序进行切片等高级操作。
过程分析阶段:经过编译器翻译后的程序大多是面向过程的,即使对于面向对象语言生成的可执行程序来说,编译器依然通过相关技术将其翻译为过程式代码。过程分析阶段的主要目标就是将目标文件中的过程信息恢复出来,包括过程边界分析、过程名(可能并不存在)、参数列表和返回值信息。过程边界信息可以通过相关过程调用指令和返回指令的信息得到,有时也需要借助一些特殊的系统库函数调用(如exit函数)。
类型分析阶段:本阶段的目标在于,正确反映原程序中各个存储单元(包括寄存器和内存)所携带的类型信息。该分析主要有两种方式,分别是基于指令语义的方式和基于过程式分析的方式。
结果输出阶段:结果输出是逆向分析的最终阶段,该阶段决定了如何将分析结果有效地呈现在分析人员面前。例如,输出结果是以某种高级语言为载体的程序代码,这样容易被人理解,通过简单的修改便可以应用在其他软件系统中。当然,输出的方式可以是多种多样的,究竟选择哪种方式完成依赖于具体分析的需求。